#include <iostream>   //关于声明与定义的关系，main函数与子函数的前后关系，以及函数g可以作为一个（变量）返回等。
#include<functional>
using namespace std;

int f(int a, int b, char op); //这里是声明函数类，而不是int整数类！
std::function<int(int, int, char)>delegate1();

int main()
{

    auto g = f;            //只是赋值
    std::cout << g(1,2,'-') << std::endl;

    auto d = delegate1();  //也是赋值
    std::cout << d(1,2,'-') << std::endl;

    return 0;
}

int f(int a, int b, char op) //这里是定义f函数（如果放在main函数前可以代替f函数的声明，定义是大王，声明是小王）
{
    int result = 0;
    switch(op) {

            case '+': {
                result =a + b;
                break; // 如果这里没有break，则程序会继续执行result = a - b;
            }
            case '-': {
                result = a - b;
                break; // 如果这里没有break，则程序会继续执行result = a * b;
            }
            case '*': {
                result = a * b;
                break; // 如果这里没有break，则程序会继续执行result = a / b;
            }
            case '/': {
                if (b == 0) {
                    return -9999;
                }
                result = a / b;
                break;
            }
            default: {
                std::cout << "Operator undefined." << std::endl;
                result = -9999;
            }
        }
        return result;

}

std::function<int(int, int, char)>delegate1(){

    std::function<int(int, int, char)> g = f; //这是个类型，一种模板类

    return g;   //目的就是为了说明函数g可以作为一个（变量）返回！返回的就是一个std::function的类型。
}

